iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
3
Modern Web

30天帶你潮玩Spring Boot Zone系列 第 14

[Day14] – Spring Boot 與MySQL數據庫的應用教學

  • 分享至 

  • xImage
  •  

閱讀時間: 20分鐘

在Day8提到建立MySQL數據庫,相信大家都成功做到。同一時間在過去的幾天,大家對Spring Boot的認識也多了一些,接下來就是和大家講一下怎樣在Spring Boot連接MySQL數據庫。
由於今天的教學需要建立各種檔案,所以大家需要多花時間來閱讀及完成練習。

第1步, 建立一個數據庫的一份資料表(Table)

詳細可以去Day 8的教學看看
今天的教學會使用的數據庫的表格如下:

use sys;
CREATE TABLE `staffInfo` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `EMAIL` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
  `PASSWORD` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `POSITION` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `PHONE` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `CREATE_DATE` datetime DEFAULT NULL,
  PRIMARY KEY (`ID`)
  )

第2步, 修改pom.xml 加入依賴(dependency)

< dependencies > </dependencies>之間加入下面的代碼

        <!-- For DataBase connection -->
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		
		<!-- For DataBase connection -->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

最終的完整代碼是:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.8.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>spring-project-2026</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>spring-project-2026</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
		<!-- Template Engine -->
		<dependency>
      		<groupId>org.springframework.boot</groupId>
      		<artifactId>spring-boot-starter-thymeleaf</artifactId>
    	</dependency>
    	
    	<!-- For DataBase connection -->
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		
		<!-- For DataBase connection -->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
    	
    	
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

JDBC(Java Database Connectivity)是一種規範(API),是Java語言中用來規範用戶端程式怎樣存取數據庫的應用程式介面,提供查詢和更新資料庫中資料等的方法。所以當建立一個數據庫連線時,除了加入有關數據庫的類型的依賴還要加入為Java存取數據庫的應用程式介面的依賴。

第3步, 修改application.properties加入數據庫的資料

# For MySQL connection
spring.datasource.url=jdbc:mysql://localhost:3306/sys?serverTimezone=UTC&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.http.encoding.force=true

最終的完整代碼是:

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

# For MySQL connection
spring.datasource.url=jdbc:mysql://localhost:3306/sys?serverTimezone=UTC&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.http.encoding.force=true

解釋:
localhost:3306 是數據庫的port位置,預設是3306,可以根據不同情況去修改的。
sys 是數據庫的名稱(注意不是資料表的名稱而是數據庫的名稱,數據庫可以有很多。(假設你的數據庫的名稱是hellodatabase, 那在localhost:3306/後面就填上” hellodatabase”。(就變成jdbc:mysql://localhost:3306/hellodatabase)
在問號後面是各種參數的值,如果大家和我一樣都是用MySQL,就必須要包括以下兩個參數。
serverTimezone=UTC&useSSL=false
serverTimezone 是一個和時區有關的,而UTC是全球標準時間,可以根據你的時區選擇合適的值。
useSSL是指需不需要SSL連線,必須要包括這參數的值,否則會報錯。
而它的值選擇useSSL=false就可以。

第4步, 建立新的model (在新的package)

負責資料的收集或提取
https://ithelp.ithome.com.tw/upload/images/20190919/20119569gIdOfoqg9a.jpg

完整代碼:

package com.example.model;

import org.springframework.stereotype.Component;

@Component
public class StaffModel {
	
	 private int id;
	  private String email;
	  private String phone;
	  private String password;
	  private String position;
	  
	  public int getId() {
		return id;
	  }
	  
	  public void setId(int id) {
		this.id = id;
	  }
	  public String getEmail() {
		return email;
	  }
	  
	  public void setEmail(String email) {
		this.email = email;
	  }
	  
	  public String getPhone() {
		return phone;
	  }
	  
	  public void setPhone(String phone) {
		this.phone = phone;
	  }
	  
	  public String getPassword() {
		return password;
	  }
	  
	  public void setPassword(String password) {
		this.password = password;
	  }
	  
	  public String getPosition() {
		return position;
	  }
	  
	  public void setPosition(String position) {
		this.position = position;
	  }
	  
	  

}

第5步, 建立新的repository (在新的package)

負責與數據庫溝通,需要運用SQL語言來操作CRUD。

完整代碼:

package com.example.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.example.model.StaffModel;

@Repository
public class StaffRepository {
	
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public void addStaff(StaffModel staffModel){
		System.out.println("EXCUTE INSERT MEMBER");
	  jdbcTemplate.update("INSERT INTO staffInfo(PASSWORD, EMAIL, POSITION, PHONE, CREATE_DATE) "
	  		+ "VALUES (?,?,?,?,NOW())",staffModel.getPassword(), staffModel.getEmail(),
	  		staffModel.getPosition(),staffModel.getPhone());
  }


}

第6步, 建立新的service (在新的package)

負責簡化代碼,在這裡建立各種CRUD的指令。
完整代碼:

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.model.StaffModel;
import com.example.repository.StaffRepository;

@Service
public class StaffService {
	
	@Autowired
	StaffRepository staffRepository;
	public void addStaff(StaffModel staffModel){
		staffRepository.addStaff(staffModel);
	}

}

第7步, 建立新的controller (在新的package)

https://ithelp.ithome.com.tw/upload/images/20190919/20119569t1G0ywcwKw.jpg

在src/main/java底下創建新的package叫com.example.controller
負責做各種mapping,如果在url找到相應用的mapping就會執行。

完整代碼:

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.model.StaffModel;
import com.example.service.StaffService;

@RestController
public class StaffController {
	
		@Autowired
		StaffModel staffModel;
		
		@Autowired
		StaffService staffService;
	    @RequestMapping("/addStaff")
	    public String hello(){
	    	staffModel = new StaffModel();
	    	staffModel.setPassword("1234");
	    	staffModel.setEmail("email@email.com");
	    	staffModel.setPhone("22334455");
	    	staffModel.setPosition("Manager");
	    	staffService.addStaff(staffModel);
	        return "New Staff added";
	    }


}

第8步, 修改SpringProject2026Application

要運用@ComponentScan把所有相關的package都加在括號內
還有@EntityScan,把所有相關的package都加在括號內
目的是讓系統去檢查各個package的檔案。

完整代碼:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({"com.example.demo","com.example.model","com.example.controller","com.example.service","com.example.repository"})
@EntityScan({"com.example.demo","com.example.model","com.example.controller","com.example.service","com.example.repository"})
public class SpringProject2026Application extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(SpringProject2026Application.class, args);
	}

}

第9步, 執行spring boot 應用程式

http://localhost:8080/spring-project-2026/addStaff
如果成功會出現以下畫面:
https://ithelp.ithome.com.tw/upload/images/20190919/20119569LPp63JCNTg.jpg

第10步, 最終檢查

開啟MySQL數據庫,檢查有沒有新的資料寫進數據庫中的staffInfo。
https://ithelp.ithome.com.tw/upload/images/20190919/20119569FzpvkQ9KxM.jpg

參考文章/網站/書本:


上一篇
[Day 13] – 認識Spring Data JPA, JPA, Hibernate
下一篇
[Day15] – Spring Boot @ComponentScan與@EntityScan
系列文
30天帶你潮玩Spring Boot Zone15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
kop14922000
iT邦新手 5 級 ‧ 2020-07-16 11:50:36

請問 我執行到最後一個步驟 執行spring boot 應用程式
之後進入http://localhost:8080/spring-project-2020/addStaff (我專案改成2020)
可是進入之後出現這個畫面
https://ithelp.ithome.com.tw/upload/images/20200716/20128694as8s9mb273.png
請問是環境設定錯了還是程式碼的部分有問題呢?

痾 解決了 可是我也不知道為什麼解決了
我把StaffController.java移到跟SpringProject2020Application.java同一個package
之後又移回到原本的package裡就突然可以了
另外我想問一下
run on server用Tomcat做連結 跟 用spring boot app 這兩個是差在哪裡
我用前者不會出現上方的錯誤 用下方的話就會
是因為沒有透過Tomcat 去跟MySQL做連結的關係嗎?

當spring boot 執行我記得tomcat 就會自己起了我記得是這樣
有誤的話可以糾正我一下XD

我也碰到同樣的問題,我的 Sever Tomcat failed to stop 了,請問有大大可以替小弟解釋一樣可能會 failed 的原因嗎?

0

如果說這一段有報錯的

   <!-- For DataBase connection -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-j</artifactId>
		<scope>runtime</scope>
	</dependency>
	
	<!-- For DataBase connection -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
	</dependency>
    

可以看看下列影片,就可以知道怎麼解決了~
Yes

我要留言

立即登入留言